Исследовательский анализ датасета 2015 Street Tree Census - Tree Data

Author

Aleksei Bogachev

Published

June 16, 2024

Краткое описание

Датасет содержит информацию о деревьях, растущих на улицах Нью-Йорка, собранную в рамках проекта 2015 Street Tree Census волонтёрами и сотрудниками NYC Parks & Recreation и партнёрских организаций.

Собранные данные включают в себя информацию о видах деревьев, диаметре и оценку здоровья. Доступны сопроводительные данные, показывающие статус сбора и публикации данных по всему городу.

Подробнее о датасете можно узнать на его сайте.

Данный отчёт содержит исследовательский анализ данных, в том числе следующие пункты: - превью данных - таблица с небольшой выборкой из датасета, - оценка количества пропусков в столбцах с помощью библиотеки missingno, - диаграммы попарного распределения признаков, - матрицу попарной корреляции между вещественными признаками, - карту расположения деревьев из датасета.

Описание данных

В следующей таблице приведено переведённое описание данных. Подробную информацию можно получить на сайте датасета.

Название столбца Описание Тип данных
1 tree_id Уникальный идентификатор каждого дерева. Число
2 block_id Идентификатор, связывающий каждое дерево с блоком в таблице блоков/шейп-файле, в который оно отображается. (“Identifier linking each tree to the block in the blockface table/shapefile that it is mapped on.”) Число
3 created_at Дата и вермя создания записи. Дата и время (datetime)
4 tree_dbh Диаметр дерева, измеренный приблизительно в 137 см (54”) над землёй. Данные собраны как для мёртвых, так и для живых деревьев. Для пеньков используется признак stump_diam Число
5 stump_diam Диаметр пенька, измеренный через центр, округлённый до ближайшего целого. Диаметр измерен в дюймах. Число
6 curb_loc Расположение грядки (клумбы, газона), в которой находится дерево, относительно бордюра; деревья располагаются либо вдоль бордюра (OnCurb), либо со смещением от бордюра (OffsetFromCurb). Текст
7 status Статус, указывающий является ли дерево живым, стоящим мёртвым или пеньком. Текст
8 health Оценка здоровья дерева пользователем. Текст
9 spc_latin Название вида на латыни, например “Acer rubrum”. Текст
10 spc_common Обывательское название вида, например “red maple”. Текст
11 steward Indicates the number of unique signs of stewardship observed for this tree. Not recorded for stumps or dead trees. Текст
12 guards Указывает, присутствует ли ограждение (охрана?) и считает ли пользователь ее полезной или вредной. Для сухостойных деревьев и пней не отмечено. Текст
13 sidewalk Указывает, был ли один из краёв тротуара, непосредственно прилегающий к дереву, поврежден, треснут или поднят. Для сухостойных деревьев и пней не отмечено. Текст
14 user_type Поле содержит категорию пользователя, внёсшего запись в данные. Текст
15 problems Текст
16 root_stone Указывает на наличие проблемы с корнями, вызванной брусчаткой на клумбе дерева. Текст
17 root_grate Указывает на наличие проблемы с корнями, вызванной металлическими решетками на клумбе дерева Текст
18 root_other Указывает на наличие других проблем с корнями. Текст
19 trunk_wire Указывает на наличие проблемы со стволом дерева, вызванной проволокой или веревкой, обернутой вокруг ствола. Текст
20 trnk_light Указывает на наличие проблемы со стволом, вызванной освещением, установленным на дереве. Текст
21 trnk_other Указывает на другие проблемы со стволом. Текст
22 brch_light Указывает на наличие проблемы с ветвями, вызванной освещением (обычно гирляндами) или проводами в ветвях. Текст
23 brch_shoe Указывает на наличие проблемы с ветками, вызванной кроссовками в ветках. Текст
24 brch_other Указывает на наличие других проблем с ветвями дерева. Текст
25 address Ближайший предполагаемый адрес к дереву. Текст
26 postcode Почтовый индекс. Число
27 zip_city Город, полученный из почтового индекса. Часто (но не всегда) это то же самое, что и район. Текст
28 cb_num Community board in which tree point is located. Число
29 borocode Код района, в котором расположено дерево: 1 (Манхэттен), 2 (Бронкс), 3 (Бруклин), 4 (Куинс), 5 (Стейтен-Айленд). Число
30 boroname Название района, в котором расположено дерево. Текст
31 cncldist Муниципальный округ, в котором находится дерево Число
32 st_assem Район Государственного собрания, в котором находится дерево. (State Assembly District in which tree point is located.) Число
33 st_senate Район Сената штата, в котором находится дерево. (State Senate District in which tree point is located.) Число
34 nta Код NTA, соответствующий районов по данным переписи населения США 2010 года, в который попадает дерево. (This is the NTA Code corresponding to the neighborhood tabulation area from the 2010 US Census that the tree point falls into.) Текст
35 nta_name Название NTA, соответствующее району по данным переписи населения США 2010 года, в который попадает дерево. (This is the NTA name corresponding to the neighborhood tabulation area from the 2010 US Census that the tree point falls into.) Текст
36 boro_ct Это идентификатор участка переписи, в который попадает дерево. Число
37 state Все строки меют одно и то же значение этого признака, равное “New York”. Текст
38 latitude Широта Число
39 longitude Долгота Число
40 x_sp Координата X в Государственной плоской системе координат (SPCS), используемой в США. Единица измерения футы. (X coordinate, in state plane. Units are feet.) Число
41 y_sp Координата Y в Государственной плоской системе координат (SPCS), используемой в США. Единица измерения футы. (Y coordinate, in state plane. Units are feet.) Число
42 council_district Муниципальный округ. Число
43 census_tract Переписной участок Число
44 bin Число
45 bbl Число

Загрузка данных

Загрузка данных и их описания выполняется, если данные и описание не были загружены ранее.

Данные загружаются с помощью SODA API.

Show the code
%%bash
if [ ! -f ../../references/ny_tree_census_description.ptrees_problems ]; then
    echo "Загрузка описания датасета."
    poetry run python ../../src/data/get_data.py get-description
    echo "Загрузка завершена. Подробнее в ../../logs/src.logs.logs.log"
else
    echo "Описание датасета было загружено ранее."
fi
Загрузка описания датасета.
/dockeruser/.cache/pypoetry/virtualenvs/src-x7HGV2Ur-py3.11/bin/python: can't open file '/dockeruser/ny_tree_census/website/../../src/data/get_data.py': [Errno 2] No such file or directory
Загрузка завершена. Подробнее в ../../logs/src.logs.logs.log
Show the code
%%bash
if [ ! -f /dockeruser/ny_tree_census/data/raw/data.csv ]; then
    echo "Загрузка датасета."
    poetry run python ../../src/data/get_data.py get-data
    echo "Загрузка завершена. Подробнее в ../../logs/src.logs.logs.log"
else
    echo "Датасет был загружен ранее."
fi
Датасет был загружен ранее.

Анализ данных

Импорт модулей

Show the code
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from plotly import express as px

from src.visualization import (
    explore_cat_feature,
    explore_cat_vs_cat,
    explore_num_feature,
    plot_corr_matrix,
    review_data,
)

%matplotlib inline

Знакомство с данными

Вывод общей информации о датафрейме

Считаем загруженный ранее файл с датасетом и выведем общую информацию о нем.

Show the code
dataset: pd.DataFrame = pd.read_csv("/dockeruser/ny_tree_census/data/raw/data.csv")

review_data(dataset)
В данных
строк: 683788
столбцов: 45

Первые 10 строк таблицы:
tree_id block_id created_at tree_dbh stump_diam curb_loc status health spc_latin spc_common steward guards sidewalk user_type problems root_stone root_grate root_other trunk_wire trnk_light trnk_other brch_light brch_shoe brch_other address zipcode zip_city cb_num borocode boroname cncldist st_assem st_senate nta nta_name boro_ct state latitude longitude x_sp y_sp council_district census_tract bin bbl
0 3 501451 2015-05-19T00:00:00.000 24 0 OnCurb Alive Good Quercus palustris pin oak 1or2 None Damage NYC Parks Staff None No No No No No No No No No 766 MANIDA STREET 10474 Bronx 202 2 Bronx 17 84 32 BX27 Hunts Point 2009300 New York 40.816467 -73.889175 1014925.946 236757.4196 17.0 93.0 2006497.0 2.027630e+09
1 4 501451 2015-05-19T00:00:00.000 20 0 OnCurb Alive Good Quercus palustris pin oak 1or2 None NoDamage NYC Parks Staff None No No No No No No No No No 1241 LAFAYETTE AVENUE 10474 Bronx 202 2 Bronx 17 84 32 BX27 Hunts Point 2009300 New York 40.816434 -73.889595 1014809.582 236745.2369 17.0 93.0 2006002.0 2.027400e+09
2 7 501911 2015-05-19T00:00:00.000 3 0 OnCurb Alive Poor Betula pendula silver birch 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1242 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 34 BX27 Hunts Point 2009300 New York 40.814092 -73.889123 1014941.504 235892.2330 17.0 93.0 2006623.0 2.027650e+09
3 8 501911 2015-05-19T00:00:00.000 3 0 OnCurb Alive Poor Betula pendula silver birch 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1242 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 34 BX27 Hunts Point 2009300 New York 40.814100 -73.889070 1014956.216 235895.1546 17.0 93.0 2006623.0 2.027650e+09
4 9 501911 2015-05-19T00:00:00.000 4 0 OnCurb Alive Poor Betula pendula silver birch 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1242 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 34 BX27 Hunts Point 2009300 New York 40.814107 -73.889021 1014969.752 235897.8422 17.0 93.0 2006623.0 2.027650e+09
5 10 501911 2015-05-19T00:00:00.000 4 0 OnCurb Alive Good Tilia cordata littleleaf linden 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1242 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 34 BX27 Hunts Point 2009300 New York 40.814116 -73.888965 1014985.053 235900.8809 17.0 93.0 2006623.0 2.027650e+09
6 11 501911 2015-05-19T00:00:00.000 4 0 OnCurb Alive Good Tilia cordata littleleaf linden 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1246 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 34 BX27 Hunts Point 2009300 New York 40.814124 -73.888922 1014997.010 235903.8452 17.0 93.0 2006624.0 2.027650e+09
7 12 501911 2015-05-19T00:00:00.000 4 0 OnCurb Alive Good Tilia cordata littleleaf linden 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1246 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 34 BX27 Hunts Point 2009300 New York 40.814142 -73.888847 1015017.807 235910.3816 17.0 93.0 2006624.0 2.027650e+09
8 13 501911 2015-05-19T00:00:00.000 4 0 OnCurb Alive Good Tilia cordata littleleaf linden 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1246 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 32 BX27 Hunts Point 2009300 New York 40.814163 -73.888758 1015042.420 235918.1168 17.0 93.0 2006624.0 2.027650e+09
9 14 501911 2015-05-19T00:00:00.000 3 0 OnCurb Alive Good Gleditsia triacanthos var. inermis honeylocust 3or4 None NoDamage TreesCount Staff None No No No No No No No No No 1246 SPOFFORD AVENUE 10474 Bronx 202 2 Bronx 17 84 32 BX27 Hunts Point 2009300 New York 40.814193 -73.888630 1015077.847 235929.0085 17.0 93.0 2006624.0 2.027650e+09

Общая информация о столбцах:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 683788 entries, 0 to 683787
Data columns (total 45 columns):
 #   Column            Non-Null Count   Dtype  
---  ------            --------------   -----  
 0   tree_id           683788 non-null  int64  
 1   block_id          683788 non-null  int64  
 2   created_at        683788 non-null  object 
 3   tree_dbh          683788 non-null  int64  
 4   stump_diam        683788 non-null  int64  
 5   curb_loc          683788 non-null  object 
 6   status            683788 non-null  object 
 7   health            652172 non-null  object 
 8   spc_latin         652169 non-null  object 
 9   spc_common        652169 non-null  object 
 10  steward           652173 non-null  object 
 11  guards            652172 non-null  object 
 12  sidewalk          652172 non-null  object 
 13  user_type         683788 non-null  object 
 14  problems          652124 non-null  object 
 15  root_stone        683788 non-null  object 
 16  root_grate        683788 non-null  object 
 17  root_other        683788 non-null  object 
 18  trunk_wire        683788 non-null  object 
 19  trnk_light        683788 non-null  object 
 20  trnk_other        683788 non-null  object 
 21  brch_light        683788 non-null  object 
 22  brch_shoe         683788 non-null  object 
 23  brch_other        683788 non-null  object 
 24  address           683788 non-null  object 
 25  zipcode           683788 non-null  int64  
 26  zip_city          683788 non-null  object 
 27  cb_num            683788 non-null  int64  
 28  borocode          683788 non-null  int64  
 29  boroname          683788 non-null  object 
 30  cncldist          683788 non-null  int64  
 31  st_assem          683788 non-null  int64  
 32  st_senate         683788 non-null  int64  
 33  nta               683788 non-null  object 
 34  nta_name          683788 non-null  object 
 35  boro_ct           683788 non-null  int64  
 36  state             683788 non-null  object 
 37  latitude          683788 non-null  float64
 38  longitude         683788 non-null  float64
 39  x_sp              683788 non-null  float64
 40  y_sp              683788 non-null  float64
 41  council_district  677269 non-null  float64
 42  census_tract      677269 non-null  float64
 43  bin               674229 non-null  float64
 44  bbl               674229 non-null  float64
dtypes: float64(8), int64(11), object(26)
memory usage: 234.8+ MB

Доля пропусков в каждом признаке:
tree_id             0.00
block_id            0.00
created_at          0.00
tree_dbh            0.00
stump_diam          0.00
curb_loc            0.00
status              0.00
health              0.05
spc_latin           0.05
spc_common          0.05
steward             0.05
guards              0.05
sidewalk            0.05
user_type           0.00
problems            0.05
root_stone          0.00
root_grate          0.00
root_other          0.00
trunk_wire          0.00
trnk_light          0.00
trnk_other          0.00
brch_light          0.00
brch_shoe           0.00
brch_other          0.00
address             0.00
zipcode             0.00
zip_city            0.00
cb_num              0.00
borocode            0.00
boroname            0.00
cncldist            0.00
st_assem            0.00
st_senate           0.00
nta                 0.00
nta_name            0.00
boro_ct             0.00
state               0.00
latitude            0.00
longitude           0.00
x_sp                0.00
y_sp                0.00
council_district    0.01
census_tract        0.01
bin                 0.01
bbl                 0.01
dtype: float64

Описательные статистики для числовых признаков:
count mean std min 10% 25% 50% 75% 90% max
tree_id 683788.0 3.652050e+05 2.081221e+05 3.000000e+00 7.512770e+04 1.865828e+05 3.662145e+05 5.461702e+05 6.526333e+05 7.226940e+05
block_id 683788.0 3.137931e+05 1.148390e+05 1.000020e+05 2.006310e+05 2.215560e+05 3.199670e+05 4.046240e+05 5.038540e+05 9.999990e+05
tree_dbh 683788.0 1.127979e+01 8.723042e+00 0.000000e+00 3.000000e+00 4.000000e+00 9.000000e+00 1.600000e+01 2.400000e+01 4.500000e+02
stump_diam 683788.0 4.324630e-01 3.290241e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.400000e+02
zipcode 683788.0 1.091625e+04 6.515534e+02 8.300000e+01 1.030100e+04 1.045100e+04 1.121400e+04 1.136500e+04 1.142000e+04 1.169700e+04
cb_num 683788.0 3.435054e+02 1.157406e+02 1.010000e+02 2.010000e+02 3.020000e+02 4.020000e+02 4.120000e+02 5.020000e+02 5.030000e+02
borocode 683788.0 3.358500e+00 1.166746e+00 1.000000e+00 2.000000e+00 3.000000e+00 4.000000e+00 4.000000e+00 5.000000e+00 5.000000e+00
cncldist 683788.0 2.994318e+01 1.432853e+01 1.000000e+00 1.000000e+01 1.900000e+01 3.000000e+01 4.300000e+01 5.000000e+01 5.100000e+01
st_assem 683788.0 5.079158e+01 1.896652e+01 2.300000e+01 2.600000e+01 3.300000e+01 5.200000e+01 6.400000e+01 7.900000e+01 8.700000e+01
st_senate 683788.0 2.061578e+01 7.390844e+00 1.000000e+01 1.100000e+01 1.400000e+01 2.100000e+01 2.500000e+01 3.200000e+01 3.600000e+01
boro_ct 683788.0 3.404914e+06 1.175863e+06 1.000201e+06 2.002701e+06 3.011700e+06 4.008100e+06 4.103202e+06 5.014606e+06 5.032300e+06
latitude 683788.0 4.070126e+01 9.031136e-02 4.049847e+01 4.058196e+01 4.063193e+01 4.070061e+01 4.076223e+01 4.083069e+01 4.091292e+01
longitude 683788.0 -7.392406e+01 1.235835e-01 -7.425496e+01 -7.413196e+01 -7.398050e+01 -7.391291e+01 -7.383491e+01 -7.377011e+01 -7.370049e+01
x_sp 683788.0 1.005280e+06 3.428505e+04 9.133493e+05 9.476079e+05 9.896578e+05 1.008386e+06 1.029991e+06 1.047987e+06 1.067248e+06
y_sp 683788.0 1.947984e+05 3.290206e+04 1.209738e+05 1.513119e+05 1.695152e+05 1.945603e+05 2.170196e+05 2.419426e+05 2.718941e+05
council_district 677269.0 3.002733e+01 1.430172e+01 1.000000e+00 1.000000e+01 1.900000e+01 3.000000e+01 4.300000e+01 5.000000e+01 5.100000e+01
census_tract 677269.0 1.195737e+04 3.074574e+04 1.000000e+00 8.800000e+01 2.020000e+02 5.160000e+02 1.417000e+03 3.030200e+04 1.579030e+05
bin 674229.0 3.495439e+06 1.193275e+06 1.000000e+06 2.002847e+06 3.031991e+06 4.020352e+06 4.263123e+06 5.054225e+06 5.515124e+06
bbl 674229.0 3.413414e+09 1.174892e+09 0.000000e+00 2.024360e+09 3.011240e+09 4.008560e+09 4.105700e+09 5.028820e+09 5.080500e+09
Описательные статистики для категориальных признаков:
count unique top freq
created_at 683788 483 2015-10-27T00:00:00.000 6852
curb_loc 683788 2 OnCurb 656896
status 683788 3 Alive 652173
health 652172 3 Good 528850
spc_latin 652169 132 Platanus x acerifolia 87014
spc_common 652169 132 London planetree 87014
steward 652173 4 None 487823
guards 652172 4 None 572306
sidewalk 652172 2 NoDamage 464978
user_type 683788 3 TreesCount Staff 296284
problems 652124 232 None 426280
root_stone 683788 2 No 543789
root_grate 683788 2 No 680252
root_other 683788 2 No 653466
trunk_wire 683788 2 No 670514
trnk_light 683788 2 No 682757
trnk_other 683788 2 No 651215
brch_light 683788 2 No 621423
brch_shoe 683788 2 No 683377
brch_other 683788 2 No 659433
address 683788 408701 106 CROSS BAY BOULEVARD 262
zip_city 683788 48 Brooklyn 177300
boroname 683788 5 Queens 250551
nta 683788 188 SI01 12969
nta_name 683788 188 Annadale-Huguenot-Prince's Bay-Eltingville 12969
state 683788 1 New York 683788

Дубликаты не обнаружены.

Выводы

Датасет не содержит дубликатов, но содержит пропуски. Пропуски не должны быть проблемой на этапе исследовательского анализа, однако их придётся обработать, прежде чем передать данные модели машинного обучения, если это будет необходимо.

Пропуски содержатся в следующих столбцах: - health - 5%; - spc_latin - 5%; - spc_common - 5%; - steward - 5%; - guards - 5%; - sidewalk - 5%; - problems - 5%; - council_district - 1%; - census_tract - 1%; - bin - 1%; - bbl - 1%;

Признаки tree_id, block_id, created_at содержат уникальный идентификатор дерева, уникальный идентификатор блока и дату создания записи. Не будем их рассматривать, по крайней мере, по началу.

Не имеет смысла исследовать признак state, так как данный столбце целиком заполенен значением “New York”.

Датасет содержит как категориальные, так и количественные признаки.

К количественным признакам относятся следующие: - tree_dbh;
- stump_diam;
- latitude; - longitude; - x_sp; - y_sp; - bin; - bbl.

Cледующие признаки, хоть и были прочитаны с типом int64, с точки зрения своего физического смысла, являют категориальными: - zipcode;
- cb_num;
- borocode; - cncldist;
- st_assem;
- st_senate; - boro_ct; - council_district; - census_tract.

К категориальным признакам также относятся признаки - curb_loc; - status; - health; - spc_latin; - spc_common; - steward; - guards; - sidewalk; - user_type; - problems; - root_stone; - root_grate; - root_other; - trunk_wire; - trnk_light; - trnk_other; - brch_light; - brch_shoe; - brch_other; - address; - zip_city; - boroname; - nta; - nta_name; - state.

Многие категориальные признаки имеют высокую кардинальность.

Подсчитаем количество уникальных значений для категориальных признаков, которые изначально были распознаны как количественные.

Show the code
columns = [
    "zipcode",
    "cb_num",
    "borocode",
    "cncldist",
    "st_assem",
    "st_senate",
    "boro_ct",
    "council_district",
    "census_tract",
]

pd.DataFrame(
    dataset[columns].nunique(), columns=["Количество уникальных значений"]
)
Количество уникальных значений
zipcode 191
cb_num 59
borocode 5
cncldist 51
st_assem 65
st_senate 26
boro_ct 2152
council_district 51
census_tract 1315

Таким образом, среди категориальных признаков мы можем исследовать с помощью графиков следующие: - curb_loc; - status; - health; - steward; - guards; - sidewalk; - user_type; - root_stone; - root_grate; - root_other; - trunk_wire; - trnk_light; - trnk_other; - brch_light; - brch_shoe; - brch_other; - zip_city; - boroname; - cb_num; - borocode; - cncldist; - st_senate; - council_district.

Исследование отдельных признаков

Количественные признаки

К количественным признакам отнесём следующие: - tree_dbh;
- stump_diam;
- latitude; - longitude; - x_sp; - y_sp; - bin; - bbl.

Рассмотрим их распределения.

tree_dbh

Признак содержит диаметр дерева в, измеренный приблизительно в 137 см (54”) над землёй.

Show the code
explore_num_feature(
    data=dataset,
    column_name="tree_dbh",
    bins=51,
)
Признак tree_dbh
Количество пропусков: 0

Описательные статистики:
tree_dbh
count 683788.000000
mean 11.279787
std 8.723042
min 0.000000
10% 3.000000
25% 4.000000
50% 9.000000
75% 16.000000
90% 24.000000
max 450.000000

Форма распределения значений признака значительно отклоняется от формы нормального. Распределение имеет тяжёлый хвост и большое количество выбросов в большую сторону.

Признак может быть строго равен нулю. Скорее всего, значение данного признака равно нулю для пеньков. Согласно описанию данных диаметр пеньков заносится в признак stump_diam.

Рассмотрим распределение значений данного признак в диапазоне 0 < tree_dbh <= 100 более подробно.

Show the code
explore_num_feature(
    data=dataset.query("tree_dbh > 0 and tree_dbh <=100"),
    column_name="tree_dbh",
    bins=51,
)
Признак tree_dbh
Количество пропусков: 0

Описательные статистики:
tree_dbh
count 665786.000000
mean 11.565285
std 8.416264
min 1.000000
10% 3.000000
25% 5.000000
50% 10.000000
75% 16.000000
90% 24.000000
max 100.000000

stump_diam

Диаметр пенька, измеренный через центр, в дюймах.

Show the code
explore_num_feature(
    data=dataset,
    column_name="stump_diam",
)
Признак stump_diam
Количество пропусков: 0

Описательные статистики:
stump_diam
count 683788.000000
mean 0.432463
std 3.290241
min 0.000000
10% 0.000000
25% 0.000000
50% 0.000000
75% 0.000000
90% 0.000000
max 140.000000

В датасете большинство наблюдений относится к деревьям, а не к пенькам, поэтому данный признак содержит абсолютное большинство нулей. Диаметр стволов деревьев заносится в признак tree_dbh.

Выберем только те записи, где диаметр пенька строго больше нуля и меньше или равен 100 и рассмотрим распределение диаметров повторно.

Show the code
explore_num_feature(
    data=dataset.query("stump_diam > 0 and stump_diam <= 100"),
    column_name="stump_diam",
    bins=51,
)
Признак stump_diam
Количество пропусков: 0

Описательные статистики:
stump_diam
count 17644.000000
mean 16.691793
std 11.828303
min 1.000000
10% 4.000000
25% 7.000000
50% 14.000000
75% 23.000000
90% 33.000000
max 100.000000

Форма распределения значений признака значительно отклоняется от формы нормального. Распределение имеет тяжёлый хвост и большое количество выбросов в большую сторону.

Форма распределения значений диаметров пеньков напоминает форму распределения значений диаметров стволов tree_dbh, что закономерно.

Таким образом, признаки tree_dbh и stump_diam стоить попробовать объединить в один признак diam и рассматривать совместно.

latitude

Широта точки в которой расположено дерево на карте.

Show the code
explore_num_feature(
    data=dataset,
    column_name="latitude",
)
Признак latitude
Количество пропусков: 0

Описательные статистики:
latitude
count 683788.000000
mean 40.701261
std 0.090311
min 40.498466
10% 40.581956
25% 40.631928
50% 40.700612
75% 40.762228
90% 40.830693
max 40.912918

Форма распределения близка к форме нормального распределения, но имеет несколько мод, которые могут соответствовать центрам “кластеров” деревьев.

Позже мы рассмотрим распределение точек одновременно по признаку latitude и признаку longitude, а также нанесём точки с деревьями на карту, что позволит понять причину появления нескольких мод.

longitude

Долгота точки в которой расположено дерево на карте.

Show the code
explore_num_feature(
    data=dataset,
    column_name="longitude",
)
Признак longitude
Количество пропусков: 0

Описательные статистики:
longitude
count 683788.000000
mean -73.924060
std 0.123583
min -74.254965
10% -74.131957
25% -73.980500
50% -73.912911
75% -73.834910
90% -73.770112
max -73.700488

Форма распределения значительно отличается от формы нормального распределения. Распределение имеет как минимум две моды.

Позже мы рассмотрим распределение записей одновременно по признаку latitude и признаку longitude, а также нанесём точки с деревьями на карту, что позволит понять причину появления нескольких мод.

x_sp

Координата X в Государственной плоской системе координат (SPCS), используемой в США. Единица измерения футы.

Show the code
explore_num_feature(data=dataset, column_name="x_sp")
Признак x_sp
Количество пропусков: 0

Описательные статистики:
x_sp
count 6.837880e+05
mean 1.005280e+06
std 3.428505e+04
min 9.133493e+05
10% 9.476079e+05
25% 9.896578e+05
50% 1.008386e+06
75% 1.029991e+06
90% 1.047987e+06
max 1.067248e+06

Распределение повторяет распределение признака longitude.

y_sp

Координата Y в Государственной плоской системе координат (SPCS), используемой в США. Единица измерения футы.

Show the code
explore_num_feature(data=dataset, column_name="y_sp")
Признак y_sp
Количество пропусков: 0

Описательные статистики:
y_sp
count 683788.000000
mean 194798.424625
std 32902.061114
min 120973.792200
10% 151311.945170
25% 169515.153700
50% 194560.252500
75% 217019.571950
90% 241942.646120
max 271894.092100

Распределение повторяет распределение признака latitude.

bin и bbl

В описании датасета отсутствуют комментарии для этих признаков, но они были распознаны как количественные.

Рассмотрим их распределения.

Show the code
explore_num_feature(data=dataset, column_name="bin")

explore_num_feature(data=dataset, column_name="bbl")
Признак bin
Количество пропусков: 9559

Описательные статистики:
bin
count 6.742290e+05
mean 3.495439e+06
std 1.193275e+06
min 1.000000e+06
10% 2.002847e+06
25% 3.031991e+06
50% 4.020352e+06
75% 4.263123e+06
90% 5.054225e+06
max 5.515124e+06

Признак bbl
Количество пропусков: 9559

Описательные статистики:
bbl
count 6.742290e+05
mean 3.413414e+09
std 1.174892e+09
min 0.000000e+00
10% 2.024360e+09
25% 3.011240e+09
50% 4.008560e+09
75% 4.105700e+09
90% 5.028820e+09
max 5.080500e+09

Судя по гистограммам, признаки являются категориальными, подсчитаем количество уникальных значений для каждого из них.

Show the code
pd.DataFrame(
    dataset[["bin", "bbl"]].nunique(),
    columns=["Количество уникальных значений"],
)
Количество уникальных значений
bin 378888
bbl 366635

Выведем несколько значений этих признаков.

Show the code
dataset[["bin", "bbl"]].sample(10)
bin bbl
78217 1060853.0 1.020468e+09
163932 1029778.0 1.011420e+09
278906 5011288.0 5.003910e+09
405188 3258737.0 3.040220e+09
261912 5007893.0 5.002930e+09
107136 5038353.0 5.023800e+09
661130 3099944.0 3.046120e+09
482978 5069887.0 5.054030e+09
655307 4217332.0 4.102070e+09
600026 4194591.0 4.092970e+09

Похоже, что данные признаки содержат какие-то коды или координаты с большим количеством уникальных значений.

created_at

Рассмотрим признак created_at, содержащий дату и время создания записи. Подсчитаем количество записей созданных в

Show the code
(
    dataset.assign(created_at=lambda row: pd.to_datetime(row.created_at))
    .loc[:, ["created_at", "tree_id"]]
    .resample("MS", on="created_at")
    .count()
    .rename(columns={"tree_id": "count"})
    .reset_index()
    .assign(created_at=lambda row: row.created_at.dt.date)
    .plot(
        kind="bar",
        x="created_at",
        y="count",
        title="Количество записей внесённых в разное время",
    )
)

plt.show()

Больше всего записей было внесено в октябре 2015, самая низкая активность участников проекта наблюдалась в период с января 2016 по апрель 2016.

Категориальные признаки

Среди категориальных признаков мы можем исследовать с помощью графиков следующие: - curb_loc; - status; - health; - steward; - guards; - sidewalk; - user_type; - root_stone; - root_grate; - root_other; - trunk_wire; - trnk_light; - trnk_other; - brch_light; - brch_shoe; - brch_other; - zip_city; - boroname; - cb_num; - borocode; - cncldist; - st_senate; - council_district.

curb_loc

Рассмотрим категориальный признак curb_loc, содержащий информацию о расположении грядки (клумбы, газона), в которой находится дерево, относительно бордюра; деревья располагаются либо вдоль бордюра (OnCurb), либо со смещением от бордюра (OffsetFromCurb).

Show the code
explore_cat_feature(
    data=dataset,
    column_name="curb_loc",
    title="Расположение клумбы относительно бордюра",
    xlabel="Количество наблюдений",
    ylabel="Расположение клумбы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака curb_loc
Значение признака curb_loc Количество повторений
0 OnCurb 656896
1 OffsetFromCurb 26892

Большинство деревьев (клумб) расположены вдоль бордюра.

status

Рассмотрим категориальный признак status - статус, указывающий является ли дерево живым, стоящим мёртвым или пеньком.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="status",
    title="Статус дерева\n(живое / мёртвое / пенёк)",
    xlabel="Количество наблюдений",
    ylabel="Статус",
)
Количество уникальных знаний: 3
Количество повторов уникальных значений признака status
Значение признака status Количество повторений
0 Alive 652173
1 Stump 17654
2 Dead 13961

В датасете очень мало пеньков и мёртвых деревьев.

health

Рассмотрим категориальный признак health, содержащий оценку здоровья дерева пользователем.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="health",
    title="Оценка здоровья дерева",
    xlabel="Количество наблюдений",
    ylabel="Оценка",
)
Количество уникальных знаний: 3
Количество повторов уникальных значений признака health
Значение признака health Количество повторений
0 Good 528850
1 Fair 96504
2 NaN 31616
3 Poor 26818

Состояние большинства деревьев оценено как хорошее, при этом признак, содержит некоторое количество пропусков. Вполне возможно, что эти пропуски соответствуют пенькам и мёртвым деревьям. Чтобы проверить эти гипотезу подсчитаем для каждого статуса дерева количество каждого значения признака health.

Show the code
dataset.groupby("status")["health"].value_counts(dropna=False)
status  health
Alive   Good      528850
        Fair       96504
        Poor       26818
        NaN            1
Dead    NaN        13961
Stump   NaN        17654
Name: health, dtype: int64

Для живых деревьев признак health содержит пропущенное значение только в одном случае, все остальные пропуски соответствуют пням и мёртвым деревьям.

steward

Рассмотрим категориальный признак steward. Согласно описанию, содержит пропущенные значения для пней и мёртвых деревьев.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="steward",
    title="Steward",
    xlabel="Количество наблюдений",
)
Количество уникальных знаний: 4
Количество повторов уникальных значений признака steward
Значение признака steward Количество повторений
0 None 487823
1 1or2 143557
2 NaN 31615
3 3or4 19183
4 4orMore 1610

Признак можно рассматривать как ранговый и перекодировать целыми числами.

guards

Рассмотрим категориальный признак guards, содержащий информацию об ограждении вокруг дерева. Согласно описанию, признак содержит пропущенные значения для пней и мёртвых деревьев.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="guards",
    title="Ограждения",
    xlabel="Количество наблюдений",
)
Количество уникальных знаний: 4
Количество повторов уникальных значений признака guards
Значение признака guards Количество повторений
0 None 572306
1 Helpful 51866
2 NaN 31616
3 Harmful 20252
4 Unsure 7748

У большинства деревьев ограждения отсутствуют.

sidewalk

Рассмотрим категориальный признак sidewalk, который указывает, был ли один из краёв тротуара, непосредственно прилегающий к дереву, поврежден, треснут или поднят. Согласно описанию, признак содержит пропущенные значения для пней и мёртвых деревьев.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="sidewalk",
    title="sidewalk\n(состояние края тротуара)",
    xlabel="Количество наблюдений",
    ylabel="sidewalk",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака sidewalk
Значение признака sidewalk Количество повторений
0 NoDamage 464978
1 Damage 187194
2 NaN 31616

user_type

Рассмотрим категориальный признак user_type, который содержит категорию пользователя, внёсшего запись в данные.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="user_type",
    title="Категории пользователей,\nвнёсших данные",
    xlabel="Количество наблюдений",
    ylabel="Категория пользователя",
)
Количество уникальных знаний: 3
Количество повторов уникальных значений признака user_type
Значение признака user_type Количество повторений
0 TreesCount Staff 296284
1 Volunteer 217518
2 NYC Parks Staff 169986

Примечательно, что существенная часть данных добавлена волотнёрами.

root_stone

Рассмотрим категориальный признак root_stone, который указывает на наличие проблемы с корнями, вызванной брусчаткой на клумбе дерева.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="root_stone",
    title="Проблемы с корнями\nиз-за брусчатки на клумбе",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака root_stone
Значение признака root_stone Количество повторений
0 No 543789
1 Yes 139999

У большинства деревьев нет проблем с брусчаткой. Видимо, признак также указан и для пней и для мёртвых деревьев.

root_grate

Рассмотрим категориальный признак root_grate, который указывает на наличие проблемы с корнями, вызванной металлическими решетками на клумбе дерева.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="root_grate",
    title="Проблемы с корнями\nиз-за решёток на клумбе",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака root_grate
Значение признака root_grate Количество повторений
0 No 680252
1 Yes 3536

Проблемы, вызванные решётками встречаются очень редко. Похоже, признак также указан для пней и мёртвых деревьев.

root_other

Рассмотрим категориальный признак root_other, Который указывает на наличие других проблем с корнями.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="root_other",
    title="Другие проблемы с корнями",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака root_other
Значение признака root_other Количество повторений
0 No 653466
1 Yes 30322

У большинства деревьев нет проблем данной категории. Видимо, признак также указан и для пней и для мёртвых деревьев.

trunk_wire

Рассмотрим категориальный признак trunk_wire, который указывает на наличие проблем со стволом дерева, вызванной проволокой или веревкой, обернутой вокруг ствола.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="trunk_wire",
    title="Проблемы со стволом\nиз-за проволоки или верёвки",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака trunk_wire
Значение признака trunk_wire Количество повторений
0 No 670514
1 Yes 13274

Проблема встречается крайне редко. Похоже, признак также указан для пней и мёртвых деревьев.

trnk_light

Рассмотрим категориальный признак trnk_light, который указывает на наличие проблем со стволом дерева, вызванной освещением, установленным на дереве.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="trnk_light",
    title="Проблемы со стволом\nиз-за освещения",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака trnk_light
Значение признака trnk_light Количество повторений
0 No 682757
1 Yes 1031

Проблема встречается настолько редко, что информативность данного признака ставится под вопрос.

trnk_other

Рассмотрим категориальный признак trnk_other, который указывает на наличие других проблем со стволом дерева.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="trnk_other",
    title="Другие проблемы со стволом",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака trnk_other
Значение признака trnk_other Количество повторений
0 No 651215
1 Yes 32573

Проблема встречается довольно редко и указана в том числе для пней и мёртвых деревьев.

brch_light

Рассмотрим категориальный признак brch_light, который указывает на наличие проблемы с ветвями, вызванной освещением (обычно гирляндами) или проводами в ветвях.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="brch_light",
    title="Проблемы с ветвями из-за освещения",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака brch_light
Значение признака brch_light Количество повторений
0 No 621423
1 Yes 62365

Проблема встречается довольно редко и указана в том числе для пней и мёртвых деревьев.

brch_shoe

Рассмотрим категориальный признак brch_shoe, который указывает на наличие проблемы с ветвями из-за кросовок в них.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="brch_shoe",
    title="Проблемы с ветвями из-за кросовок",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака brch_shoe
Значение признака brch_shoe Количество повторений
0 No 683377
1 Yes 411

Проблема встречается настолько редко, что информативность признака ставится под вопрос. Признак не содержит пропусков, а значит указан в том числе и для пней и для мёртвых деревьев.

brch_other

Рассмотрим категориальный признак brch_other, который указывает на наличие других проблем с ветвями.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="brch_other",
    title="Другие проблемы с ветвями",
    xlabel="Количество наблюдений",
    ylabel="Наличие проблемы",
)
Количество уникальных знаний: 2
Количество повторов уникальных значений признака brch_other
Значение признака brch_other Количество повторений
0 No 659433
1 Yes 24355

Проблемы встречаются довольно редко, признак указан в том числе для пней и мёртвых деревьев.

zip_city

Рассмотрим категориальный признак zip_city, который содержит город, полученный из почтового индекса.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="zip_city",
    title="Город, полученный из почтового индекса.",
    xlabel="Количество наблюдений",
    ylabel="Город",
    figsize=(7, 10),
)
Количество уникальных знаний: 48
Количество повторов уникальных значений признака zip_city
Значение признака zip_city Количество повторений
0 Brooklyn 177300
1 Staten Island 105318
2 Bronx 85203
3 New York 64488
4 Jamaica 26028
5 Flushing 23389
6 Ridgewood 10937
7 Fresh Meadows 10441
8 Queens Village 10127
9 Astoria 10007
10 Whitestone 9449
11 Bayside 8679
12 Springfield Gardens 7470
13 Little Neck 7280
14 Forest Hills 7059
15 Oakland Gardens 7054
16 Far Rockaway 6887
17 East Elmhurst 6475
18 Rosedale 6324
19 Woodside 5651
20 South Ozone Park 5494
21 Ozone Park 5456
22 Bellerose 5121
23 Middle Village 4893
24 Saint Albans 4697
25 Howard Beach 4650
26 Corona 4346
27 Elmhurst 4204
28 Glen Oaks 4130
29 Maspeth 4033
30 Hollis 3591
31 Rockaway Park 3572
32 Long Island City 3479
33 Richmond Hill 3391
34 Jackson Heights 3295
35 Cambria Heights 3229
36 College Point 3099
37 Rego Park 3084
38 Woodhaven 2855
39 South Richmond Hill 2805
40 Arverne 2013
41 Kew Gardens 1743
42 Sunnyside 1664
43 Floral Park 1539
44 Central Park 935
45 New Hyde Park 865
46 Breezy Point 30
47 Inwood 9

Большинство записей соответствуют Бруклину.

boroname

Рассмотрим категориальный признак boroname, который указывает название района, в котором расположено дерево.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="boroname",
    title="Название района",
    xlabel="Количество наблюдений",
    ylabel="Название района",
)
Количество уникальных знаний: 5
Количество повторов уникальных значений признака boroname
Значение признака boroname Количество повторений
0 Queens 250551
1 Brooklyn 177293
2 Staten Island 105318
3 Bronx 85203
4 Manhattan 65423

Большинство деревьев раcположены в районе Queens.

cb_num

Рассмотрим категориальный признак cb_num.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="cb_num",
    title="cb_num",
    xlabel="Количество наблюдений",
    figsize=(7, 10),
)
Количество уникальных знаний: 59
Количество повторов уникальных значений признака cb_num
Значение признака cb_num Количество повторений
0 503 53934
1 413 37017
2 407 30620
3 411 28071
4 412 26379
5 502 25717
6 501 25667
7 408 20383
8 405 19550
9 318 19319
10 305 16589
11 410 15224
12 315 13758
13 401 13008
14 312 12500
15 414 12412
16 301 12066
17 409 11481
18 210 11180
19 212 11108
20 403 10827
21 310 10598
22 314 10536
23 306 10290
24 406 10258
25 211 10094
26 209 9943
27 303 9437
28 311 9343
29 108 9269
30 107 8814
31 302 8789
32 402 8645
33 317 8418
34 307 8105
35 112 7182
36 304 7164
37 404 6676
38 204 6643
39 208 6071
40 110 5962
41 308 5735
42 207 5406
43 309 5333
44 316 5275
45 206 5192
46 106 5061
47 102 5019
48 202 5016
49 109 4987
50 103 4939
51 111 4933
52 203 4911
53 201 4826
54 205 4813
55 104 4704
56 313 4038
57 101 2397
58 105 2156

borocode

Рассмотрим категориальный признак borocode, содержащий код района, в котором расположено дерево: - 1 - (Манхэттен), - 2 - (Бронкс), - 3 - (Бруклин), - 4 - (Куинс), - 5 - (Стейтен-Айленд).

Show the code
explore_cat_feature(
    data=dataset,
    column_name="borocode",
    title="Код района",
    xlabel="Количество наблюдений",
    ylabel="Код",
)
Количество уникальных знаний: 5
Количество повторов уникальных значений признака borocode
Значение признака borocode Количество повторений
0 4 250551
1 3 177293
2 5 105318
3 2 85203
4 1 65423

Признак является закодированным признаком boroname.

cncldist

Рассмотрим категориальный признак cncldist, содержащий муниципальный округ, в котором находится дерево.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="cncldist",
    title="Муниципальный округ",
    xlabel="Количество наблюдений",
    ylabel="Округ",
    figsize=(7, 10),
)
Количество уникальных знаний: 51
Количество повторов уникальных значений признака cncldist
Значение признака cncldist Количество повторений
0 51 51236
1 19 34429
2 50 33035
3 23 30743
4 31 23161
5 49 21047
6 27 20116
7 32 19508
8 24 18993
9 30 18551
10 13 17587
11 46 16913
12 28 15807
13 20 14189
14 29 13946
15 39 13859
16 43 13196
17 42 13117
18 33 12784
19 17 11851
20 48 11786
21 45 11758
22 44 11659
23 22 11537
24 37 10990
25 34 10812
26 12 10734
27 26 10679
28 35 10525
29 11 9820
30 18 9798
31 38 9567
32 47 9259
33 36 9023
34 3 8631
35 4 8521
36 41 8232
37 9 8213
38 6 8050
39 15 8044
40 21 8016
41 25 7851
42 8 7293
43 40 6838
44 7 6572
45 16 6531
46 10 6501
47 14 6240
48 1 5694
49 2 5564
50 5 4982

Большинство деревьев расположены в округе 51.

st_senate

Рассмотрим категориальный признак st_senate, содержащий район Сената штата, в котором находится дерево.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="st_senate",
    title="Район Сената штата",
    xlabel="Количество наблюдений",
    ylabel="Район",
    figsize=(7, 10),
)
Количество уникальных знаний: 26
Количество повторов уникальных значений признака st_senate
Значение признака st_senate Количество повторений
0 24 87241
1 11 67705
2 15 44624
3 14 38351
4 10 35044
5 34 31066
6 19 29083
7 22 27179
8 23 25401
9 16 24146
10 25 23499
11 17 22225
12 12 21847
13 21 20730
14 18 20603
15 13 18827
16 20 16848
17 26 16456
18 32 15915
19 36 14544
20 33 14462
21 29 14285
22 30 13929
23 27 13685
24 28 13195
25 31 12898

Большинство наблюдений соответствуют району Сената штата с номером 24.

council_district

Рассмотрим категориальный признак council_district, содержащий муниципальный округ, в котором находится дерево.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="council_district",
    title="Муниципальный округ",
    xlabel="Количество наблюдений",
    ylabel="Муниципальный округ",
    figsize=(7, 10),
)
Количество уникальных знаний: 51
Количество повторов уникальных значений признака council_district
Значение признака council_district Количество повторений
0 51.0 50865
1 19.0 33626
2 50.0 32948
3 23.0 30411
4 31.0 22763
5 49.0 20863
6 27.0 20061
7 32.0 19687
8 24.0 18620
9 30.0 18307
10 13.0 17433
11 46.0 16863
12 28.0 15635
13 20.0 14128
14 39.0 13837
15 29.0 13789
16 42.0 13083
17 43.0 13054
18 33.0 12740
19 17.0 11825
20 48.0 11802
21 45.0 11717
22 44.0 11648
23 22.0 11640
24 37.0 10995
25 34.0 10700
26 26.0 10659
27 12.0 10525
28 35.0 10497
29 18.0 9702
30 11.0 9655
31 38.0 9510
32 47.0 9200
33 36.0 9025
34 4.0 8649
35 3.0 8506
36 41.0 8207
37 9.0 7994
38 15.0 7921
39 25.0 7831
40 21.0 7810
41 8.0 7343
42 6.0 6947
43 40.0 6866
44 NaN 6519
45 7.0 6519
46 16.0 6495
47 14.0 6359
48 10.0 6137
49 2.0 5537
50 1.0 5404
51 5.0 4931

Большинство деревьев относится к муниципальному округу с номером 51.

Признак содержит небольшое количество пропусков, что может быть связано как с ошибками в данных, так и с особенностями административно-территорального деления в США.

spc_latin

Рассмотрим категориальный признак spc_latin, содержащий название вида дерева на латыни. Признак обладает высокой кардинальностью, поэтому выведем 50 наиболее часто встречающихся значений.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="spc_latin",
    n_top=50,
    title="Виды деревьев",
    xlabel="Количество наблюдений",
    ylabel="Латинское название вида",
    figsize=(7, 10),
)
Количество уникальных знаний: 132
Количество повторов уникальных значений признака spc_latin
Значение признака spc_latin Количество повторений
0 Platanus x acerifolia 87014
1 Gleditsia triacanthos var. inermis 64264
2 Pyrus calleryana 58931
3 Quercus palustris 53185
4 Acer platanoides 34189
5 Tilia cordata 29742
6 Prunus 29279
7 Zelkova serrata 29258
8 Ginkgo biloba 21024
9 Styphnolobium japonicum 19338
10 Acer rubrum 17246
11 Fraxinus pennsylvanica 16251
12 Tilia americana 13530
13 Acer saccharinum 12277
14 Liquidambar styraciflua 10657
15 Quercus rubra 8400
16 Tilia tomentosa 7995
17 Ulmus americana 7975
18 Acer 7080
19 Prunus cerasifera 6879
20 Quercus bicolor 6598
21 Acer platanoides 'Crimson King' 5923
22 Ulmus parvifolia 5345
23 Prunus virginiana 4888
24 Syringa reticulata 4568
25 Cercis canadensis 3801
26 Koelreuteria paniculata 3719
27 Malus 3527
28 Gymnocladus dioicus 3364
29 Quercus phellos 3184
30 Metasequoia glyptostroboides 3020
31 Crataegus 2988
32 Acer saccharum 2844
33 Acer pseudoplatanus 2731
34 Fraxinus 2609
35 Acer campestre 2550
36 Celtis occidentalis 2382
37 Quercus acutissima 2244
38 Maackia amurensis 2197
39 Carpinus betulus 2099
40 Acer ginnala 2049
41 Amelanchier 2032
42 Robinia pseudoacacia 1784
43 Quercus alba 1686
44 Quercus robur 1644
45 Ulmus pumila 1595
46 Cornus florida 1552
47 Carpinus caroliniana 1517
48 Quercus shumardii 1487
49 Quercus coccinea 1465

Чаще всех встречаются деревья вида Platanus x acerifolia (плантан кленолистный).

spc_common

Рассмотрим категориальный признак spc_common, содержащий обывательское название вида дерева. Признак обладает высокой кардинальностью, поэтому выведем 50 наиболее часто встречающихся значений.

Show the code
explore_cat_feature(
    data=dataset,
    column_name="spc_common",
    n_top=50,
    title="Виды деревьев",
    xlabel="Количество наблюдений",
    ylabel="Обывательское название",
    figsize=(7, 10),
)
Количество уникальных знаний: 132
Количество повторов уникальных значений признака spc_common
Значение признака spc_common Количество повторений
0 London planetree 87014
1 honeylocust 64264
2 Callery pear 58931
3 pin oak 53185
4 Norway maple 34189
5 littleleaf linden 29742
6 cherry 29279
7 Japanese zelkova 29258
8 ginkgo 21024
9 Sophora 19338
10 red maple 17246
11 green ash 16251
12 American linden 13530
13 silver maple 12277
14 sweetgum 10657
15 northern red oak 8400
16 silver linden 7995
17 American elm 7975
18 maple 7080
19 purple-leaf plum 6879
20 swamp white oak 6598
21 crimson king maple 5923
22 Chinese elm 5345
23 'Schubert' chokecherry 4888
24 Japanese tree lilac 4568
25 eastern redbud 3801
26 golden raintree 3719
27 crab apple 3527
28 Kentucky coffeetree 3364
29 willow oak 3184
30 dawn redwood 3020
31 hawthorn 2988
32 sugar maple 2844
33 sycamore maple 2731
34 ash 2609
35 hedge maple 2550
36 common hackberry 2382
37 sawtooth oak 2244
38 Amur maackia 2197
39 European hornbeam 2099
40 Amur maple 2049
41 serviceberry 2032
42 black locust 1784
43 white oak 1686
44 English oak 1644
45 Siberian elm 1595
46 flowering dogwood 1552
47 American hornbeam 1517
48 Schumard's oak 1487
49 scarlet oak 1465

На первом месте всё также плантан кленолистный.

problems

Рассмотрим категориальный признак problems, содержащий информацию о проблемах с деревом. Признак обладает высокой кардинальностью, поэтому выведем 50 наиболее часто встречающихся значений и, на всякий случай, подсчитаем количество пропусков.

Show the code
print(
    "Количество пропусков в столбце в полных данных: "
    f"{dataset.problems.isna().sum()}\n"
)

explore_cat_feature(
    data=dataset,
    column_name="problems",
    n_top=50,
    title="Проблемы деревьев",
    xlabel="Количество наблюдений",
    ylabel="Проблема",
    figsize=(7, 10),
)
Количество пропусков в столбце в полных данных: 31664

Количество уникальных знаний: 232
Количество повторов уникальных значений признака problems
Значение признака problems Количество повторений
0 None 426280
1 Stones 95673
2 BranchLights 29452
3 Stones,BranchLights 17808
4 RootOther 11418
5 TrunkOther 11143
6 BranchOther 8352
7 Stones,TrunkOther 5183
8 Stones,RootOther 4468
9 WiresRope 4095
10 Stones,BranchOther 3786
11 TrunkOther,BranchOther 2477
12 WiresRope,BranchLights 2308
13 RootOther,TrunkOther 2137
14 MetalGrates 2098
15 Stones,WiresRope,BranchLights 1953
16 RootOther,BranchLights 1918
17 RootOther,TrunkOther,BranchOther 1807
18 TrunkOther,BranchLights 1558
19 Stones,TrunkOther,BranchOther 1539
20 RootOther,BranchOther 1503
21 Stones,WiresRope 1457
22 Stones,RootOther,TrunkOther 1360
23 Stones,TrunkOther,BranchLights 1176
24 Stones,RootOther,BranchLights 901
25 BranchLights,BranchOther 756
26 Stones,RootOther,BranchOther 743
27 Stones,RootOther,TrunkOther,BranchOther 617
28 RootOther,TrunkOther,BranchLights 540
29 Stones,BranchLights,BranchOther 526
30 Stones,RootOther,TrunkOther,BranchLights 495
31 RootOther,WiresRope,BranchLights 410
32 WiresRope,TrunkOther 325
33 RootOther,WiresRope 324
34 WiresRope,BranchOther 314
35 Stones,WiresRope,TrunkOther,BranchLights 256
36 TrunkLights,BranchLights 235
37 TrunkLights 218
38 MetalGrates,TrunkOther 218
39 WiresRope,TrunkOther,BranchLights 210
40 MetalGrates,BranchOther 208
41 Stones,MetalGrates 207
42 Stones,RootOther,WiresRope,BranchLights 202
43 MetalGrates,RootOther 159
44 Stones,TrunkOther,BranchLights,BranchOther 156
45 TrunkOther,BranchLights,BranchOther 154
46 RootOther,BranchLights,BranchOther 126
47 Stones,RootOther,WiresRope 124
48 Stones,RootOther,BranchLights,BranchOther 113
49 MetalGrates,TrunkOther,BranchOther 110

Признак содержит записи как об отдельных проблемах, так и об их комбинациях, перечисленных через запятую. Интересно, что признак также содержит пропуски.

Чаще всего деревья либо не имеют никаких проблем, либо имеют проблемы с камнями и осветительными приборами в ветвях. Закономерно, комбинации проблем встречаются значительно реже.

Чтобы понять какие отдельные проблемы встречаются чаще всего исключим из датасета деревья не имеющие проблем и записи, содержащие пропуски в данном столбце, разделим все комбинации проблем на отдельные проблемы и сосчитаем как часто они встречаются.

Show the code
trees_problems = (
    dataset.query("problems != 'None' and problems.notna()")
    .set_index(keys=["tree_id", "problems"], drop=False)
    .drop(columns="tree_id")
    .problems.str.split(",")
    .explode()
    .rename_axis(index={"problems": "problems_str"})
    .reset_index()
)

explore_cat_feature(
    data=trees_problems,
    column_name="problems",
    title="Частота отдельных проблем деревьев",
    xlabel="Количество наблюдений",
    ylabel="Проблема",
    figsize=(10, 5),
)
Количество уникальных знаний: 9
Количество повторов уникальных значений признака problems
Значение признака problems Количество повторений
0 Stones 139999
1 BranchLights 62365
2 TrunkOther 32573
3 RootOther 30322
4 BranchOther 24355
5 WiresRope 13274
6 MetalGrates 3536
7 TrunkLights 1031
8 Sneakers 411

Подсчитаем количество отдельных проблем у одного дерева, для этого создадим признак problems_count и выясним как часто встречается разное количество проблем у одного дерева.

Show the code
explore_cat_feature(
    data=(
        trees_problems.assign(
            problems_count=lambda x: trees_problems.groupby(
                by=["tree_id", "problems_str"]
            ).problems.transform("count")
        )
    ),
    column_name="problems_count",
    title="Количество отдельных проблем у одного дерева",
    xlabel="Количество наблюдений",
    ylabel="Количество отдельных проблем",
    figsize=(10, 5),
)
Количество уникальных знаний: 9
Количество повторов уникальных значений признака problems_count
Значение признака problems_count Количество повторений
0 1 162552
1 2 95500
2 3 38148
3 4 10096
4 5 1245
5 6 294
6 7 14
7 9 9
8 8 8

Чаще всего одно дерево имеет 1 - 2 отдельные проблемы, при этом, максимальное количество проблем равно 9.

Попробуем выяснить какие проблемы деревьев встречаются вместе. Будем рассматривать отдельные пары проблем.

Show the code
explore_cat_vs_cat(
    data=(
        trees_problems.merge(
            pd.Series(
                trees_problems["problems"].unique(), name="base_problems"
            ),
            how="cross",
        )
        .rename(columns={"problems": "actual_problems"})
        .assign(
            presented=(
                lambda df: df.apply(
                    lambda row: (
                        row.base_problems in row.problems_str
                        and row.actual_problems in row.problems_str
                    ),
                    axis="columns",
                )
            )
        )
        .query("presented == True")
    ),
    x="base_problems",
    y="actual_problems",
    title="Совстречаемость проблем деревьев",
    xlabel="Проблема",
    ylabel="Проблема",
    figsize=(16, 16),
    norm=matplotlib.colors.LogNorm(),
    alpha=0.5,
)
Совстречаемость проблем деревьев
actual_problems BranchLights BranchOther MetalGrates RootOther Sneakers Stones TrunkLights TrunkOther WiresRope
base_problems                  
BranchLights 62365 2331 162 5131 84 24118 577 5035 5971
BranchOther 2331 24355 484 5375 53 7983 97 7380 1026
MetalGrates 162 484 3536 390 7 426 73 551 117
RootOther 5131 5375 390 30322 51 9381 145 7560 1563
Sneakers 84 53 7 51 411 201 4 70 18
Stones 24118 7983 426 9381 201 139999 296 11293 4644
TrunkLights 577 97 73 145 4 296 1031 107 195
TrunkOther 5035 7380 551 7560 70 11293 107 32573 1474
WiresRope 5971 1026 117 1563 18 4644 195 1474 13274

Очевидно, разные пары проблем встречаются с разной частотой. Реже всех встречаются проблемы с кросовками и осветительными приборами на стволе. Чаще всех - проблемы только с камнями и проблемы только с осветительными приборами в ветвях и комбинация этих проблем. Реже всех встречаются проблемы с кросовками и комбинации этих проблем с другими. Примечательно, что в комбинациях присутствует каждая пара проблем и нет взаимоисключающих категорий.

Исследование признаков в парах

Матрица корреляции для количественных признаков

К количественным признакам относятся следующие: - tree_dbh; - stump_diam; - latitude; - longitude; - x_sp; - y_sp; - bin; - bbl.

Построим для них матрицу корреляции. Так как количественные признаки содержат выбросы, будем использовать коэффициент корреляции Кендалла.

Show the code
plot_corr_matrix(
    dataset[
        [
            "tree_dbh",
            "stump_diam",
            "latitude",
            "longitude",
            "x_sp",
            "y_sp",
            "bin",
            "bbl",
        ]
    ],
    method="kendall",
)

Пары признаков latitude и y_sp, longitude и x_sp, bin и bbl показывают очень высокую корреляцию, скорее всего величины в этих парах связаны некоторой зависимостью. Для пар latitude и y_sp, longitude и x_sp такая высокая корреляция логична, так как это широта и долгота в разных системах координат. Причина высокой корреляции между bin и bbl остаётся загадкой, так как автору не известен физический смысл этих величин. Тем не менее достаточно будет рассмотреть по одному признаку из каждой пары.

Пары категориальных признаков

spc_latin и spc_common

Проверим нет ли ошибок в сопоставлении обывательского названия вида дерева с его названием на латыне. Для этого посчитаем какое максимальное количество названий на латыне соответствует каждому обывательскому названию и наоборот.

Show the code
print(
    "Максимальное количество уникальных названий вида дерева",
    "на латыне для каждого обывательского названия:",
    dataset.groupby("spc_common").spc_latin.nunique().max(),
)

print(
    "Максимальное количество уникальных обывательских названий",
    "вида дерева для каждого названия на латыне:",
    dataset.groupby("spc_latin").spc_common.nunique().max(),
)
Максимальное количество уникальных названий вида дерева на латыне для каждого обывательского названия: 1
Максимальное количество уникальных обывательских названий вида дерева для каждого названия на латыне: 1

Таким образом, каждому уникальному названию дерева на латыне соответствует только одно уникальное обывательское название. Скорее всего, названия видов деревьев сопоставлены корректно, но не исключено, что для отдельных деревьев некорректно указано как название вида на латыне так и соответствующее обывательское название.

Совстречаемость проблем

Попробуем выяснить какие проблемы деревьев встречаются одновременно, для этого построим график, называемый Parallel Categories Diagram, из библиотеки Plotly для трёх наиболее часто встречающихся проблем, которым соответствуют значения Yes в следующих признаках:

  • root_stone,
  • brch_light,
  • trnk_other.
Show the code
cols = [
    "root_stone",
    "brch_light",
    "trnk_other",
]

fig = px.parallel_categories(
    data_frame=(
        dataset.loc[:, cols].assign(
            log10_count=np.log10(
                dataset.groupby(by=cols)["tree_id"].transform("count")
            )
        )
    ),
    dimensions=cols,
    color="log10_count",
    color_continuous_scale="greens_r",
    range_color=[3, 6],
)

fig.update_layout(
    title="Совстречаемость трёх наиболее распространённых проблем",
    title_x=0.5,
)

fig.show()